// SquareTraversal.java

import java.util.ArrayList;
import java.util.Scanner;

/*
 * 这是一个抽象类，对任何一种遍历方阵的方法给出了整体的框架。
 * 已经实现了遍历的关键步骤和打印输出的主要功能。
 * 两个可变的方法需要用户实现，以适应不同的需求。
 */
public abstract class SquareTraversal {
    // 方阵的规模，用size表示方阵的边长：
    int size = -1;

    // 获取遍历的初始点。使用抽象方法的意义是：强迫用户实现这个方法，而不至于遗漏：
    public abstract SquarePoint getInitPoint();

    // 遍历过程中当前的路径：
    ArrayList<SquarePoint> currentPath = new ArrayList<>();

    // 方阵初始化：size表示方阵的大小；initRow和initCol表示路径的起始位置：
    public void initiate(int size) {
        // 在这里添加代码：
        this.size=size;
        SquarePoint beginPoint = getInitPoint();
        //将起始点加入当前路径
        currentPath.add(beginPoint);
    }

    // 查找下一个点。
    // 如果存下一个点，则返回这个点；否则返回null。
    // 这个方法交给具体的类按照自己的场景去实现：
    public abstract SquarePoint getNext();

    // 路径推进一步（该步骤的执行之前先要判断是否存在可行的下一步）：
    public void step(SquarePoint nextPoint) {
        // 在这里添加代码：
        if (nextPoint != null) {
            currentPath.add(nextPoint); // 将下一个点添加到路径中
        }
    }

    @Override
    public String toString() {
        // 在这里添加代码：
        return "size: " + size + ", currentPath: " + currentPath;
    }

    public int[][] getCurrMatrix() {
        // 在这里添加代码：
        int[][] currMatrix =new int[size][size];


        for (int i = 0; i < currentPath.size(); i++) {
            SquarePoint point = currentPath.get(i);
            currMatrix[point.row][point.col]=1;
        }


        return currMatrix;
    }

    // 这个方法打印当前路径在整个方阵中的分布情况。
    // 没有遍历过的点用减号表示；已经遍历过的点用加号表示；当前遍历点（最后一个点）用星号表示，以突出其变化：
    public void printCurrentPath() {
        // 在这里添加代码：
        int[][] currMatrix = getCurrMatrix();
        //获取当前点
        SquarePoint lastPoint = currentPath.get(currentPath.size()-1);


        for (int i = 0; i < size; i++) {
            for (int j = 0; j < size; j++) {
                if (currMatrix[i][j] == 1){
                    //当前点
                    if (i == lastPoint.row && j == lastPoint.col)
                        System.out.print('*');
                    else
                        System.out.print('+');
                }else
                    System.out.print('-');

                System.out.print(' ');
            }
            System.out.println();
        }
    }

    // 用这个方法执行遍历的全过程。每遍历一步，都要打出路径在方阵中的整体分布情况。
    public void traverse() {
        // 在这里添加代码：

        printCurrentPath();
        SquarePoint nextPoint;
        System.out.println();
        while ((nextPoint = getNext()) != null) {
            step(nextPoint);
            printCurrentPath();
            System.out.println();
        }
    }
}